import App from './App'
import store from './store'
import { isTokenExpired } from '@/util/auth.js';
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'

// 引入全局TuniaoUI
import TuniaoUI from 'tuniao-ui'
Vue.use(TuniaoUI)

// 引入TuniaoUI提供的vuex简写方法
let vuexStore = require('@/store/$tn.mixin.js')
Vue.mixin(vuexStore)

// 引入TuniaoUI对小程序分享的mixin封装
let mpShare = require('tuniao-ui/libs/mixin/mpShare.js')
Vue.mixin(mpShare)


//定义不需要登录验证的路由白名单
const whiteList = [
  '/pages/index/index',
  '/pages/login/login',
  '/componentsPage/index-list/base/index-list?type=0',
  '/componentsPage/index-list/base/index-list?type=1',
  '/componentsPage/index-list/base/index-list?type=2',
];


// 路由白名单集合，用于存储不需要登录验证的路由
const ROUTE_WHITE_LIST = new Set(whiteList);
// token在本地存储中的键名
const TOKEN_STORAGE_KEY = 'USER_TOKEN';
// 登录页面路由
const LOGIN_ROUTE = '/pages/login/login';

/**
 * 创建路由拦截器
 * @returns {Object} 返回拦截器对象
 */
const createRouteInterceptor = () => ({
  invoke(args) {
    // 如果路由在白名单中，直接放行
    if (ROUTE_WHITE_LIST.has(args.url)) {
      return true;
    }
    // 获取存储的token
    const token = uni.getStorageSync(TOKEN_STORAGE_KEY);
    
    // 如果token不存在或已过期
    if (!token || isTokenExpired(token)) {
      // 仅在token存在且过期的情况下清除token
      if (token) {
         uni.removeStorageSync(TOKEN_STORAGE_KEY);
      }
      
      // 重定向到登录页
      uni.redirectTo({ url: LOGIN_ROUTE });
      return false;
    }

    // token有效，允许导航
    return true;
  }
});

// 为导航方法添加拦截器
['navigateTo', 'redirectTo'].forEach(method => {
  uni.addInterceptor(method, createRouteInterceptor());
});


const app = new Vue({
  store,
  ...App
})

// 引入请求封装
require('./util/request/index')(app)

app.$mount()